home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Command.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-27
|
2KB
|
144 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "Command.h"
#include "Class.h"
#include "Error.h"
#include "String.h"
#include "Port.h"
#include "ObjectTable.h"
// can't undo, causes change, don't delete
static Command ResetUndo("last command", eCmdTypeCantUndo);
// can't undo, no change, don't delete
static Command NoChanges("no changes", eCmdTypeNoChange);
Command *gNoChanges= &NoChanges;
Command *gResetUndo= &ResetUndo;
//---- Command -----------------------------------------------------------------
NewAbstractMetaImpl(Command,Object, (T(CmdNumber), TP(CmdName), TE(type),
TE(state), TP(gNoChanges), TP(gResetUndo)));
Command::Command(int itsCmdNumber, char *itsCmdName, CommandType t)
{
CmdNumber= itsCmdNumber;
CmdName= itsCmdName;
type= t;
state= eCmdStateNew;
}
Command::Command(char *itsCmdName, CommandType t)
{
CmdNumber= 9999;
CmdName= itsCmdName;
type= t;
state= eCmdStateNew;
}
void Command::Commit()
{
}
void Command::DoIt()
{
}
void Command::RedoIt()
{
DoIt();
}
void Command::UndoIt()
{
}
void Command::Done(Command*)
{
}
void Command::Finish()
{
if (this == gNoChanges || this == gResetUndo)
return;
if (state == eCmdStateDone)
Commit();
state= eCmdStateFinished;
delete this;
}
int Command::Perform()
{
if (this == gNoChanges || this == gResetUndo)
return 0;
int cc= 0;
switch (state) {
case eCmdStateNew:
DoIt();
state= eCmdStateDone;
cc= 1;
break;
case eCmdStateDone:
UndoIt();
state= eCmdStateNotDone;
cc= -1;
break;
case eCmdStateNotDone:
RedoIt();
state= eCmdStateDone;
cc= 1;
break;
case eCmdStateFinished:
fprintf(stderr, "Command::Perform: oops!\n");
break;
}
if (type == eCmdTypeNoChange)
return 0;
return cc;
}
char *Command::GetUndoName()
{
char *s1= "", *s, *cs= GetName();
if (type == eCmdTypeCantUndo)
s1= "Can't ";
if (state == eCmdStateDone)
s= "Undo";
else
s= "Redo";
if (cs && *cs)
return form("%s%s %s", s1, s, cs);
return form("%s%s", s1, s);
}
void Command::TrackConstrain(Point, Point, Point*)
{
}
void Command::TrackFeedback(Point, Point, bool)
{
}
Command *Command::TrackMouse(TrackPhase, Point, Point, Point)
{
ResetFlag(eCmdMoveEvents);
return this;
}
void Command::InspectorId(char *buf, int sz)
{
if (GetName())
strn0cpy(buf, GetName(), sz);
else
Object::InspectorId(buf, sz);
}